Agenda


R

¿Por qué R?

  • Utilizaremos R porque es open source —no tenemos que pagar una licencia por ocuparlo—
  • Porque es el lenguaje por default que se ocupa en la industria seria de análisis de datos a.k.a. ciencia de datos (SAS es para empresas viejitas y muy acartonadas! y que tienen 10,000 USD para pagar la licencia!)
  • Porque nos da mucha facilidad en todos los modelos que hay implementados y nos permite tener visualizaciones muy cool
  • Porque nos permite generar dashboards sin tener que tener a un desarrollador que no nos quiera ayudar :( porque nunca tienen tiempo!
  • Porque nos permite hacer investigación reproducible y entregar reportes de negocio
  • Porque es un plus que vale mucho en sus CV
  • …y ya la última, porque a mi me encanta :P

Markdown

Markdown es una extensión que viene en RStudio para generar reportes, estos reportes pueden ser creados en pdf o html (knit pdf o knit html respectivamente), también tiene opción para crear un documento en formato Word…. pero no hagan eso!!!!.

Generalmente ocupamos el formato pdf cuando las visualizaciones que generamos en el código son estáticas (no necesitan que el usuario interactue con ellas para obtener información), el reporte se genera con LateX por lo que los fonts y en general la presentación por default es muy profesional.

Si por otro lado necesitamos que las visualizaciones que estamos entregando sean interactivas entonces se ocupa el formato html. ESTE ES UN DOCUMENTO HECHO EN MARKDOWN :)

Markdown pemite que integremos texto normal con código de R con la opción de que el código puede o no ser mostrado en el reporte final, esto nos permite tener en un solo lugar tanto la explicación en ‘humano’ de lo que estamos haciendo como el código que ocupamos para generar los resultados.

En esta clase estaremos ocupando markdowns para la entrega de todas las tareas (from now on ╭(◔ ◡ ◔)/)

Markdown cheat sheet

Para iniciar un documento de Rmarkdown (RMD) debes seleccionar la opcion R Markdown

Template de markdown

Para la clase estaremos ocupando este template

  • Nombre Apellido, matrícula
  • Introducción al problema: ¿Qué modelo vas a aplicar?, ¿Con qué set de datos cuentas?
    • Objetivo
  • Data Profiling
  • Modelo(s) a probar
    • Justificación de la selección del modelo
  • Resultados
  • Conclusiones
  • Recomendaciones al negocio
  • Anexo
    • Información de la sesión de R

R Crash Course

Ambiente de R

Casi siempre se ocupa RStuido como el IDE donde interactúas con R. RStuido tiene 4 secciones normalmente:

  1. Sección de código: Donde escribes tu código (rmd, script, presentación). La esquina superior izquierda
  2. Sección de salida: Donde al ejecutar el código de arriba (Ctrl+Enter o bien la flecha de Run) se muestra la salida obtenida (o el error asociado). La esquina inferior izquierda
  3. Sección de ambiente: Donde puedes ir viendo las variables que estás creando y los valores que tienen. Esquina superior derecha
  4. Sección de ayuda y salida de gráficas: Donde puedes ver las gráficas que generes, la ayuda aque solicites, los paquetes que tienes cargados y un explorador de directorios para cargar archivos directamente desde el ambiente de RStudio

Instalar paquetes

install.packages("nombrepaquete")

Instalemos: ggplot2, scales, dplyr, lubridate, readr, plotly, googleVis, tidyr

Una vez que los paquetes son instalados para cargarlos en el ambiente de R y poderlos ocupar utilizamos library(nombrepaquete) \(\rightarrow\) nota que en library no se ocupan las dobles comillas para llamar al paquete.

Para obtener ayuda en R puedes ocupar el signo de interrogación seguido del nombre de la función sobre la que tienes dudas ?dim esto hará que sobre la esquina inferior derecha aparezca la información asociada al método del que pediste ayuda indicando:

  • Qué hace ese método -sección Description-
  • Cómo se usa -sección Usage-
  • Qué parámetros requiere -sección Arguments-
  • Qué devuelve -sección Value-
  • Un ejemplo de uso -sección Examples-

Asignación de variables

En R aunque existe el símbolo = la asignación siempre se realiza utilizando el símbolo <- que indica que lo que se encuentra a la derecha se asigna a lo que está a la izquierda. En cambio el símbolo = se ocupa ÚNICAMENTE cuando estás generando columnas dentro de un data frame… lo veremos más adelante.

texto_simple <- "Ejemplo asiganción de variables"
var_num <- 13

texto_simple
## [1] "Ejemplo asiganción de variables"

Tipos de datos

  • Booleans: True/False
var_bool_true <- T
var_bool_true_2 <- TRUE

class(var_bool_true)
## [1] "logical"
var_bool_true
## [1] TRUE
  • Numéricos
var_num_1 <- 13 #numeric
var_num_1
## [1] 13
var_num_2 <- 19.32 #numeric
var_num_2
## [1] 19.32
var_num_3 <- 10i #complex
var_num_3
## [1] 0+10i
class(var_num_2)
## [1] "numeric"
  • Character
str_1 <- "ejemplo 1"
str_2 <- "ejemplo 2, con algo más"

str_1
## [1] "ejemplo 1"
  • Factor
fctr <- factor(c("a","b","c"))

fctr
## [1] a b c
## Levels: a b c
  • Niveles
levels(fctr)
## [1] "a" "b" "c"

Estructuras de Datos

Vectores

Son la base de la mayoría de las otras estructura de datos más complejas en R, se crean utilizando la función c() -concatenate-

vector_1 <- c("uno","dos","tres")
vector_2 <- c(10,20,110)

vector_1
## [1] "uno"  "dos"  "tres"

Para saber la longitud de un vector se ocupa la función length()

Listas

En R una lista es un vector con otros objetos adentro, y se tiene que poner explícitamente que se trata de una lista —list()—.

obj_1 <- c(2,3)
obj_2 <- c("a","b")
obj_3 <- list(1)

lista_1 <- list(obj_1, obj_2)
lista_1
## [[1]]
## [1] 2 3
## 
## [[2]]
## [1] "a" "b"
obj_3
## [[1]]
## [1] 1

Para seleccionar cada objeto dentro de la lista, se ocupan dobles corchetes [[]].

lista_1[[1]]
## [1] 2 3

Matrices

En R una matriz es una tabla, R tiene muchas operaciones optimizadas para poder realizar operaciones entre matrices, razón por la cuál es muy ocupada en análisis de datos :), nosotros normalmente no estaremos ocupando directamente matrices sino DataFrames una abstracción mucho más amigable y flexible.

Para definir una matriz ocupas la función matrix() indicando los datos, número de renglones, número de columnas y si debe acomodar los datos por renglón o por columna

#matriz acomodando por renglon
a_matrix <- matrix(c(1:10),
                   nrow=2,
                   ncol=5,
                   byrow=T)
a_matrix
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    2    3    4    5
## [2,]    6    7    8    9   10
#matriz acomodando por columna
a_matriz <- matrix(c(1:10),
                   nrow=5,
                   ncol=2,
                   byrow=F)

DataFrames

Es por mucho la estructura de datos más utilizada en R, los data frames son tablas (como las de excel), formados por renglones y columnas (en ese orden!). Por default cuando creas un

df <- data.frame(a=vector_1, 
                 b=vector_2, stringsAsFactors = F)

df
##      a   b
## 1  uno  10
## 2  dos  20
## 3 tres 110
df2 <- data.frame(color=c("rojo","verde","amarillo","negro"),
                 estatura=c(1.68, 1.54, 1.85, 1.90),
                 sexo=c("F","F","M","M"))

df2
##      color estatura sexo
## 1     rojo     1.68    F
## 2    verde     1.54    F
## 3 amarillo     1.85    M
## 4    negro     1.90    M

Puedes saber la dimensión de un data frame -cuántos renglones y cuántas columnas- con la función dim dim(nombre_df)

dim(df2)
## [1] 4 3

Hay varias formas de interactuar con los dataFrames:

  1. Utilizando los nombres de las columnas y/o renglones (la forma más sencilla). En esta formato ocuparás el símbolo de pesos $ para extaer una columna o renglón (el renglón tiene que tener nombre!). Lamentablemente de esta forma solo puedes acceder a una columna a la vez…
df2$estatura
## [1] 1.68 1.54 1.85 1.90
  1. Utilizando el/los índices que quieres extraer. En este formato ocupas los indices de los elementos que quieres ver/extraer del dataFrame, recuerda que en R los índices inician en 1!
#todos los renglones, ciertas columnas
df2[,2:3]
##   estatura sexo
## 1     1.68    F
## 2     1.54    F
## 3     1.85    M
## 4     1.90    M
#ciertos renglones, todas las columnas
df2[2,]
##   color estatura sexo
## 2 verde     1.54    F
#renglon especifico y columna especifica
df2[2,2]
## [1] 1.54
  1. Utilizando los nombres con dplyr, lo veremos más adelante

  2. Otras posibles formas es utilizando los nombres de las columnas e índices al mismo tiempo (nota como se regresana en el orden indicado: primero sexo y luego estatura)

df2[2,c("sexo","estatura")]
##   sexo estatura
## 2    F     1.54

Para obtener los nombres de las columnas de un dataFrame puedes ocupar names(df), esto te regresará en un vector el nombre de las columnas del dataFrame en el orden en el que se encuentran en el mismo

names(df2)
## [1] "color"    "estatura" "sexo"

Puedes cambiar los nombres de las columnas ocupando la misma función names(df) asignándole un nuevo vector con los nuevos nombres

names(df2) <- c("color","sex","height")
df2
##      color  sex height
## 1     rojo 1.68      F
## 2    verde 1.54      F
## 3 amarillo 1.85      M
## 4    negro 1.90      M

O puedes cambiar solo ciertos nombres indicando el índice de la columna a la que quieres cambiar el nombre.

names(df2)[2] <- "sexo"
df2
##      color sexo height
## 1     rojo 1.68      F
## 2    verde 1.54      F
## 3 amarillo 1.85      M
## 4    negro 1.90      M

¿Por qué aquí no hizo falta el c()?

Para saber de qué tipo es un objeto se ocupa la función class(objeto)

class(df2)
## [1] "data.frame"

Puedes hacer lo mismo con un vector dentro de un data frame

class(df2$color)
## [1] "factor"

Cargar datos en R

Hay varias formas de cargar datos a R pero se tiene que tomar en cuenta el tamaño del data set. Siempre es mejor ocupar la librería readr de Hadley Wickham ;) (te presento a tu próximo nuevo ídolo!)

Cargaremos un set de datos correspondiente a información de cáncer de mama

suppressPackageStartupMessages(library(readr))

breast_cancer <- read_csv("~/Documents/itam/mineria_datos_licenciatura/data/breast_cancer.csv")
## Parsed with column specification:
## cols(
##   .default = col_double(),
##   id = col_integer(),
##   diagnosis = col_character()
## )
## See spec(...) for full column specifications.
class(breast_cancer)
## [1] "tbl_df"     "tbl"        "data.frame"
head(breast_cancer)
## # A tibble: 6 x 32
##         id diagnosis radius_mean texture_mean perimeter_mean area_mean
##      <int>     <chr>       <dbl>        <dbl>          <dbl>     <dbl>
## 1   842302         M       17.99        10.38         122.80    1001.0
## 2   842517         M       20.57        17.77         132.90    1326.0
## 3 84300903         M       19.69        21.25         130.00    1203.0
## 4 84348301         M       11.42        20.38          77.58     386.1
## 5 84358402         M       20.29        14.34         135.10    1297.0
## 6   843786         M       12.45        15.70          82.57     477.1
## # ... with 26 more variables: smoothness_mean <dbl>,
## #   compactness_mean <dbl>, concavity_mean <dbl>, `concave
## #   points_mean` <dbl>, symmetry_mean <dbl>, fractal_dimension_mean <dbl>,
## #   radius_se <dbl>, texture_se <dbl>, perimeter_se <dbl>, area_se <dbl>,
## #   smoothness_se <dbl>, compactness_se <dbl>, concavity_se <dbl>,
## #   `concave points_se` <dbl>, symmetry_se <dbl>,
## #   fractal_dimension_se <dbl>, radius_worst <dbl>, texture_worst <dbl>,
## #   perimeter_worst <dbl>, area_worst <dbl>, smoothness_worst <dbl>,
## #   compactness_worst <dbl>, concavity_worst <dbl>, `concave
## #   points_worst` <dbl>, symmetry_worst <dbl>,
## #   fractal_dimension_worst <dbl>

Operaciones básicas

Generalmente todo en R es un data frame o algún sabor más optimizado de él: tbl_df, tbl o tibble que pueden cargar una mayor cantidad de datos de manera más eficiente que el mortal dataFrame -optimizaciones de Hadley Wickham-

  • La función summary permite conocer la estadística general de cada variable en el set de datos
summary(breast_cancer)
##        id             diagnosis          radius_mean      texture_mean  
##  Min.   :     8670   Length:569         Min.   : 6.981   Min.   : 9.71  
##  1st Qu.:   869218   Class :character   1st Qu.:11.700   1st Qu.:16.17  
##  Median :   906024   Mode  :character   Median :13.370   Median :18.84  
##  Mean   : 30371831                      Mean   :14.127   Mean   :19.29  
##  3rd Qu.:  8813129                      3rd Qu.:15.780   3rd Qu.:21.80  
##  Max.   :911320502                      Max.   :28.110   Max.   :39.28  
##  perimeter_mean     area_mean      smoothness_mean   compactness_mean 
##  Min.   : 43.79   Min.   : 143.5   Min.   :0.05263   Min.   :0.01938  
##  1st Qu.: 75.17   1st Qu.: 420.3   1st Qu.:0.08637   1st Qu.:0.06492  
##  Median : 86.24   Median : 551.1   Median :0.09587   Median :0.09263  
##  Mean   : 91.97   Mean   : 654.9   Mean   :0.09636   Mean   :0.10434  
##  3rd Qu.:104.10   3rd Qu.: 782.7   3rd Qu.:0.10530   3rd Qu.:0.13040  
##  Max.   :188.50   Max.   :2501.0   Max.   :0.16340   Max.   :0.34540  
##  concavity_mean    concave points_mean symmetry_mean   
##  Min.   :0.00000   Min.   :0.00000     Min.   :0.1060  
##  1st Qu.:0.02956   1st Qu.:0.02031     1st Qu.:0.1619  
##  Median :0.06154   Median :0.03350     Median :0.1792  
##  Mean   :0.08880   Mean   :0.04892     Mean   :0.1812  
##  3rd Qu.:0.13070   3rd Qu.:0.07400     3rd Qu.:0.1957  
##  Max.   :0.42680   Max.   :0.20120     Max.   :0.3040  
##  fractal_dimension_mean   radius_se        texture_se      perimeter_se   
##  Min.   :0.04996        Min.   :0.1115   Min.   :0.3602   Min.   : 0.757  
##  1st Qu.:0.05770        1st Qu.:0.2324   1st Qu.:0.8339   1st Qu.: 1.606  
##  Median :0.06154        Median :0.3242   Median :1.1080   Median : 2.287  
##  Mean   :0.06280        Mean   :0.4052   Mean   :1.2169   Mean   : 2.866  
##  3rd Qu.:0.06612        3rd Qu.:0.4789   3rd Qu.:1.4740   3rd Qu.: 3.357  
##  Max.   :0.09744        Max.   :2.8730   Max.   :4.8850   Max.   :21.980  
##     area_se        smoothness_se      compactness_se      concavity_se    
##  Min.   :  6.802   Min.   :0.001713   Min.   :0.002252   Min.   :0.00000  
##  1st Qu.: 17.850   1st Qu.:0.005169   1st Qu.:0.013080   1st Qu.:0.01509  
##  Median : 24.530   Median :0.006380   Median :0.020450   Median :0.02589  
##  Mean   : 40.337   Mean   :0.007041   Mean   :0.025478   Mean   :0.03189  
##  3rd Qu.: 45.190   3rd Qu.:0.008146   3rd Qu.:0.032450   3rd Qu.:0.04205  
##  Max.   :542.200   Max.   :0.031130   Max.   :0.135400   Max.   :0.39600  
##  concave points_se   symmetry_se       fractal_dimension_se
##  Min.   :0.000000   Min.   :0.007882   Min.   :0.0008948   
##  1st Qu.:0.007638   1st Qu.:0.015160   1st Qu.:0.0022480   
##  Median :0.010930   Median :0.018730   Median :0.0031870   
##  Mean   :0.011796   Mean   :0.020542   Mean   :0.0037949   
##  3rd Qu.:0.014710   3rd Qu.:0.023480   3rd Qu.:0.0045580   
##  Max.   :0.052790   Max.   :0.078950   Max.   :0.0298400   
##   radius_worst   texture_worst   perimeter_worst    area_worst    
##  Min.   : 7.93   Min.   :12.02   Min.   : 50.41   Min.   : 185.2  
##  1st Qu.:13.01   1st Qu.:21.08   1st Qu.: 84.11   1st Qu.: 515.3  
##  Median :14.97   Median :25.41   Median : 97.66   Median : 686.5  
##  Mean   :16.27   Mean   :25.68   Mean   :107.26   Mean   : 880.6  
##  3rd Qu.:18.79   3rd Qu.:29.72   3rd Qu.:125.40   3rd Qu.:1084.0  
##  Max.   :36.04   Max.   :49.54   Max.   :251.20   Max.   :4254.0  
##  smoothness_worst  compactness_worst concavity_worst  concave points_worst
##  Min.   :0.07117   Min.   :0.02729   Min.   :0.0000   Min.   :0.00000     
##  1st Qu.:0.11660   1st Qu.:0.14720   1st Qu.:0.1145   1st Qu.:0.06493     
##  Median :0.13130   Median :0.21190   Median :0.2267   Median :0.09993     
##  Mean   :0.13237   Mean   :0.25427   Mean   :0.2722   Mean   :0.11461     
##  3rd Qu.:0.14600   3rd Qu.:0.33910   3rd Qu.:0.3829   3rd Qu.:0.16140     
##  Max.   :0.22260   Max.   :1.05800   Max.   :1.2520   Max.   :0.29100     
##  symmetry_worst   fractal_dimension_worst
##  Min.   :0.1565   Min.   :0.05504        
##  1st Qu.:0.2504   1st Qu.:0.07146        
##  Median :0.2822   Median :0.08004        
##  Mean   :0.2901   Mean   :0.08395        
##  3rd Qu.:0.3179   3rd Qu.:0.09208        
##  Max.   :0.6638   Max.   :0.20750

¿Qué pueden decir de este set de datos?

  • La función head devuelve los 6 primeros renglones del data frame con todas las columnas asociadas
  • La función tail devuelve los 6 últimos renglones del data frame con todas las columnas asociadas
  • La función mean devuelve el promedio de una columna -vector- en un dataFrame

  • Para conocer el promedio de la variable radius_mean

promedio_radius_mean <- mean(breast_cancer$radius_mean)
promedio_radius_mean
## [1] 14.12729
#si se desea redondear el resultado
#round(promedio_radius_mean, 2) #se redondea a 2 decimales
  • Para conocer la desviación estándar de la variable radius_mean
sd_radius_mean <- sd(breast_cancer$radius_mean)
sd_radius_mean
## [1] 3.524049
  • Para seleccionar los renglones 3 al 6 del data frame
selected_rows <- breast_cancer[3:6, ] #[renglon, columna]
selected_rows #nota que se trae todas las columnas porque no definimos cuantas!
## # A tibble: 4 x 32
##         id diagnosis radius_mean texture_mean perimeter_mean area_mean
##      <int>     <chr>       <dbl>        <dbl>          <dbl>     <dbl>
## 1 84300903         M       19.69        21.25         130.00    1203.0
## 2 84348301         M       11.42        20.38          77.58     386.1
## 3 84358402         M       20.29        14.34         135.10    1297.0
## 4   843786         M       12.45        15.70          82.57     477.1
## # ... with 26 more variables: smoothness_mean <dbl>,
## #   compactness_mean <dbl>, concavity_mean <dbl>, `concave
## #   points_mean` <dbl>, symmetry_mean <dbl>, fractal_dimension_mean <dbl>,
## #   radius_se <dbl>, texture_se <dbl>, perimeter_se <dbl>, area_se <dbl>,
## #   smoothness_se <dbl>, compactness_se <dbl>, concavity_se <dbl>,
## #   `concave points_se` <dbl>, symmetry_se <dbl>,
## #   fractal_dimension_se <dbl>, radius_worst <dbl>, texture_worst <dbl>,
## #   perimeter_worst <dbl>, area_worst <dbl>, smoothness_worst <dbl>,
## #   compactness_worst <dbl>, concavity_worst <dbl>, `concave
## #   points_worst` <dbl>, symmetry_worst <dbl>,
## #   fractal_dimension_worst <dbl>
  • Para seleccionar los renglones 3 al 6 pero solo las columnas radius_mean y diagnosis
#esto es mucho más sencillo con la libreria dplyr... lo veremos mas adelante
selected_df <- breast_cancer[3:6, c("diagnosis","radius_mean")] #[renglon, columna]
selected_df
## # A tibble: 4 x 2
##   diagnosis radius_mean
##       <chr>       <dbl>
## 1         M       19.69
## 2         M       11.42
## 3         M       20.29
## 4         M       12.45
  • La función max devuelve el valor máximo de un VECTOR
max(breast_cancer$diagnosis)
## [1] "M"
  • La función min devuelve el valor mínimo de un VECTOR
  • La función sd devuelve la desviación estándar de un VECTOR
  • La función sqrt devuelve la raíz cuadrada de un VECTOR
  • La función median devuelve la mediana de un VECTOR

Visualización

El análisis de datos casi siempre va acompañado de una visualización (cuando es posible) ya sea para explicar a terceros que no son técnicos o para que nos ayude a entender comportamientos en los datos. En R se ocupa principalmente la librería ggplot2 para realizar gran cantidad de visualizaciones.

Si bien ggplot es difícil de entender al principio, una vez que se entiende la gramática todo funciona de manera fluida.

ggplot

Ggplot tiene su propia gramática, busca que cada componente de la gráfica se pueda ir añadiendo poco a poco, siempre ocupa un componente aes en el cual definimos qué es cada eje en la gráfica.

Ocuparemos los datos que cargamos de cáncer de mama para realizar una gráficas y hacer un mini análisis exploratorio.

Cómo se ven radius_mean y texture_mean

library(ggplot2)

p <- ggplot(breast_cancer, aes(x=radius_mean, y=texture_mean)) + 
  geom_point()

plot(p)

Queremos agregarle color para identificar si hay algún patrón por tipo de tumor —diagnosis—

ggplot(breast_cancer, aes(x=radius_mean, y=texture_mean, color=diagnosis)) + 
  geom_point()

No me gusta el fondo gris, cambiémoslo a blanco y pongamos un titulo a la gráfica para saber de qué se trata

ggplot(breast_cancer, aes(x=radius_mean, y=texture_mean, color=diagnosis)) + 
  geom_point() +
  theme_bw() + #fondo blanco
  ggtitle("Promedio de radio vs promedio de textura")

Ahora veamos como se ven las diferentes variables

ggplot(breast_cancer, aes(x=radius_mean)) + 
  geom_histogram() +
  theme_bw() + #fondo blanco 
  ggtitle("histograma promedio de radio del tumor")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

ggplot(breast_cancer, aes(x=radius_mean)) + 
  geom_histogram(colour="black", fill="white") +
  theme_bw() + #fondo blanco 
  ggtitle("histograma promedio de radio del tumor")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Cómo se ve el histograma si se separan los que son de tumores benignos y tumores malignos?

ggplot(breast_cancer, aes(x=radius_mean, color=diagnosis, fill=diagnosis)) + 
  geom_histogram() +
  theme_bw() + #fondo blanco 
  ggtitle("histograma promedio de radio del tumor")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

ggplot(breast_cancer, aes(x=diagnosis, y=radius_mean, fill=diagnosis)) + 
  geom_boxplot() +
  theme_bw() + #fondo blanco 
  ggtitle("boxplot promedio de radio \nde acuerdo al tipo de tumor")

Obtengamos la proporción de tumores beningnos y malignos

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
prop_diagnosis <- breast_cancer %>% group_by(diagnosis) %>% 
  summarise(n=n()) %>% mutate(prop=n/sum(n))

ggplot(prop_diagnosis, aes(x=diagnosis, y=prop, fill=diagnosis)) +
  geom_bar(stat="identity") +
  theme_bw() +
  scale_y_continuous(limits=c(0,1))

Ggplot gallery

Algunas reglas en las visualizaciones:

  • Si los datos son discretos se ocupan puntos —scatterplots—
  • Si los datos tiene una secuencia temporal se ocupan puntos unidos con líneas
  • Si se quiere mostrar un conteo o acumulación se ocupan barras
  • No mezclar más de 3 ejes diferentes en una gráfica
  • NO hacer gráficas de pie, si lo que se desea es mostrar propociones, se utilizan barras horizontales en escala de 0-100 (siempre mostrando el 100%) para que se vea la diferencia entre las diferentes variables y siempre ordenados de mayor a menor para ver claramente la proporción
  • Si quieres meter varias métricas en una gráfica ocupa el tamaño para identificar que algo es más grande que otra cosa, el color para identificar tipos o categorías, formas para datos categóricos, color en gradiente cuando los datos son continuos.
  • Siempre pon los ejes \(x\) y \(y\) para saber las escalas de tus datos!

¿Algo malo aquí?

* Imagen tomada de flowingdata.com

¿Qué? (╯°□°)╯︵ ┻━┻

* Imagen tomada de flowingdata.com

Paren!!!! (╯°□°)╯︵ ┻━┻

* Imagen tomada de flowingdata.com

Moraleja: Pon atención a tus visualizaciones son TAN IMPORTANTES como los modelos que realizas, es tu responsabilidad presentar información precisa, sin sesgo y que permita a los demás tomar decisiones basadas en ellas.

Como NO hacer una gráfica de barras

* Imagen tomada de viz.wtf

No hagan esto!!!! (╯°□°)╯︵ ┻━┻ \(\rightarrow\) Por eso en esta clase están prohibidos los pie!!!

* Imagen tomada de viz.wtf

plotly

Todo lo anterior está muy bonito pero los clientes generalmente quieren interactuar con los datos, aunque sea solo para saber que valor tiene un punto en particular… para ello lo que ocupamos es un wrap que le permite a las gráficas que generamos en ggplot volverlas interactivas, eso es plotly.

Se puede ocupar plotly sin R directamente en python y otros lenguajes, pero es muy ocupado en R para dar intercción a las gráficas estáticas que genera ggplot.

Esta librería se puede ocupar sin una conexión a Internet!

library(plotly)
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
p <- ggplot(breast_cancer, aes(x=radius_mean, y=texture_mean, color=diagnosis)) + 
  geom_point() +
  theme_bw() + #fondo blanco
  ggtitle("Promedio de radio vs\npromedio de textura")

ggplotly(p)
## We recommend that you use the dev version of ggplot2 with `ggplotly()`
## Install it with: `devtools::install_github('hadley/ggplot2')`
p <- ggplot(breast_cancer, aes(x=diagnosis, y=radius_mean, fill=diagnosis)) + 
  geom_boxplot() +
  theme_bw() + #fondo blanco 
  ggtitle("boxplot promedio de radio \nde acuerdo al tipo de tumor")

ggplotly(p)
## We recommend that you use the dev version of ggplot2 with `ggplotly()`
## Install it with: `devtools::install_github('hadley/ggplot2')`

googleVis

Así como plotly vuelve las gráficas que generamos de ggplot interactivas, googleVis hace gráficas interactivas, aunque tristemente NO son compatibles con ggplot por lo que se tienen que generar desde 0 con la gramática propia de esa librería… (╯°□°)╯︵ ┻━┻ y además de todo se requiere estar contectado a internet cuando se muestran las visualizaciónes pues se requiere de la librería de google para que se compile el javascript que genera :(

A diferencia de ggplot que todo lo que se desea graficar debe ser columnar y solo se pueden graficar dos columnas… googleVis es al revés… cada cosa que queires graficar debe estar en su propia columna … los data frames son más anchos y cortos —en ggplot los data frames son angostos y largos—

library(googleVis)
## Creating a generic function for 'toJSON' from package 'jsonlite' in package 'googleVis'
## 
## Welcome to googleVis version 0.6.2
## 
## Please read Google's Terms of Use
## before you start using the package:
## https://developers.google.com/terms/
## 
## Note, the plot method of googleVis will by default use
## the standard browser to display its output.
## 
## See the googleVis package vignettes for more details,
## or visit http://github.com/mages/googleVis.
## 
## To suppress this message use:
## suppressPackageStartupMessages(library(googleVis))
options(gvis.plot.tag='chart')

#hacer un nuevo df con solo los valores que queremos poner en la gráfica
proportions <- gvisBarChart(prop_diagnosis, xvar="diagnosis", 
                            yvar="prop", options=list(vAxis="{title: 'diagnosis'}",
                                                      hAxis="{title: '%',
                                                      format: 'percent',
                                                      viewWindow:{min: 0,
                                                      max: 1}}"))

plot(proportions)

Referencias

Session Info

## R version 3.4.1 (2017-06-30)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 16.04.3 LTS
## 
## Matrix products: default
## BLAS: /usr/lib/libblas/libblas.so.3.6.0
## LAPACK: /usr/lib/lapack/liblapack.so.3.6.0
## 
## locale:
##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
##  [5] LC_MONETARY=es_MX.UTF-8    LC_MESSAGES=en_US.UTF-8   
##  [7] LC_PAPER=es_MX.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=es_MX.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] googleVis_0.6.2 plotly_4.7.1    bindrcpp_0.2    dplyr_0.7.1    
## [5] ggplot2_2.2.1   readr_1.1.1    
## 
## loaded via a namespace (and not attached):
##  [1] Rcpp_0.12.11      compiler_3.4.1    plyr_1.8.4       
##  [4] bindr_0.1         tools_3.4.1       digest_0.6.12    
##  [7] viridisLite_0.2.0 jsonlite_1.5      evaluate_0.10.1  
## [10] tibble_1.3.3      gtable_0.2.0      pkgconfig_2.0.1  
## [13] rlang_0.1.1       shiny_1.0.3       crosstalk_1.0.0  
## [16] yaml_2.1.14       stringr_1.2.0     httr_1.2.1       
## [19] knitr_1.16        htmlwidgets_0.9   hms_0.3          
## [22] rprojroot_1.2     grid_3.4.1        glue_1.1.1       
## [25] data.table_1.10.4 R6_2.2.2          rmarkdown_1.6    
## [28] purrr_0.2.2.2     tidyr_0.6.3       magrittr_1.5     
## [31] codetools_0.2-15  backports_1.1.0   scales_0.4.1     
## [34] htmltools_0.3.6   assertthat_0.2.0  xtable_1.8-2     
## [37] mime_0.5          colorspace_1.3-2  httpuv_1.3.5     
## [40] labeling_0.3      stringi_1.1.5     lazyeval_0.2.0   
## [43] munsell_0.4.3